package com.lsu.facade.experiment;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;

import java.awt.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * 绘制饼图
 *
 * @Author wang suo
 * @Date 2020/11/27 0027 10:14
 * @Version 1.0
 */
class Pie {

    void draw() {
        DefaultPieDataset data = getDataSet();
        JFreeChart chart = ChartFactory.createPieChart3D("学生成绩分布图", data, true,
                false, false);
        // 设置百分比
        PiePlot pieplot = (PiePlot) chart.getPlot();
        // 获得一个DecimalFormat对象，主要是设置小数问题
        DecimalFormat df = new DecimalFormat("0.00%");
        // 获得一个NumberFormat对象
        NumberFormat nf = NumberFormat.getNumberInstance();
        // 图片中显示百分比:自定义方式，{0} 表示选项， {1} 表示数值， {2} 表示所占比例 ,小数点后两位
        pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator(
                "{0}={1}({2})", NumberFormat.getNumberInstance(),
                new DecimalFormat("0.00%")));
        // 图例显示百分比:自定义方式， {0} 表示选项， {1} 表示数值， {2} 表示所占比例
        pieplot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
                "{0}={1}({2})"));

        // 没有数据的时候显示的内容
        pieplot.setNoDataMessage("无数据显示");
        pieplot.setCircular(false);
        pieplot.setLabelGap(0.02D);

        // 设置不显示空值
        pieplot.setIgnoreNullValues(true);
        // 设置不显示负值
        pieplot.setIgnoreZeroValues(true);
        // 设置标题字体
        chart.getTitle().setFont(new Font("宋体", Font.BOLD, 20));
        // 获取图表区域对象
        PiePlot piePlot = (PiePlot) chart.getPlot();
        // 解决乱码
        piePlot.setLabelFont(new Font("宋体", Font.BOLD, 10));
        chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 10));
        // 将数据显示在JFrame界面上
        ChartFrame chartFrame = new ChartFrame("学生成绩分布图", chart);
        // chart要放在Java容器组件中，ChartFrame继承自java的 JFrame 类。该第一个参数的数据是放在窗口左上角的，不是正中间的标题。
        // 以合适的大小展现图形
        chartFrame.pack();
        // 图形是否可见
        chartFrame.setVisible(true);
    }

    private static DefaultPieDataset getDataSet() {
        DefaultPieDataset dataset = new DefaultPieDataset();
        int[] nums = new int[]{
                52,
                85,
                60,
                64,
                54,
                77,
                92,
                67,
                86,
                82,
                69,
                84,
                69,
                72,
                61,
                55,
                67,
                83,
                77,
                99,
                78,
                79,
                60,
                83,
                80,
                74,
                98,
                61,
                87,
                50,
                81,
                60,
                55,
                72,
                68,
                84,
                73,
                68,
                63,
                73,
                74,
                85,
                70,
                60
        };
        int less60 = 0, to70 = 0, to80 = 0, to90 = 0, to100 = 0, total = nums.length;
        for (int num : nums) {
            if (num < 60) {
                less60++;
            } else if (num < 70) {
                to70++;
            } else if (num < 80) {
                to80++;
            } else if (num < 90) {
                to90++;
            } else {
                to100++;
            }
        }
        dataset.setValue("小于60", less60);
        dataset.setValue("60到70", to70);
        dataset.setValue("70到80", to80);
        dataset.setValue("80到90", to90);
        dataset.setValue("90到100", to100);
        return dataset;
    }
}
